#ifndef PI_H
#define PI_H

#include "gd32f30x.h"
#include "IQmath.h"

typedef struct {  _iq15  Ref;   			// Input: Reference input 
				  _iq15  Fdb;   			// Input: Feedback input 
				  _iq15  Err;				// Variable: Error
				  _iq15  Kp;				// Parameter: Proportional gain
				  _iq15  Up;				// Variable: Proportional output 
				  _iq15  Ui;				// Variable: Integral output 
				  _iq15  Ud;				// Variable: Derivative output 	
				  _iq15  OutPreSat; 		// Variable: Pre-saturated output
				  _iq15  OutMax;		    // Parameter: Maximum output 
				  _iq15  OutMin;	    	// Parameter: Minimum output
				  _iq15  Out;   			// Output: PID output 
				  _iq15  SatErr;			// Variable: Saturated difference
				  _iq15  Ki;			    // Parameter: Integral gain
				  _iq15  Kc;		     	// Parameter: Integral correction gain
				  _iq15  Kd; 		        // Parameter: Derivative gain
				  _iq15  Up1;		   	    // History: Previous proportional output
		 	 	} PIDREG3;	

#define PIDREG3_DEFAULTS { 0, 			\
                           0, 			\
                           0, 			\
                           _IQ15(1.3), 	\
                           0, 			\
                           0, 			\
                           0, 			\
                           0, 			\
                           _IQ15(1), 	\
                           _IQ15(-1), 	\
                           0, 			\
                           0, 			\
                           _IQ15(0.2), \
                           _IQ15(0.5), 	\
                           _IQ15(1.05), \
                           0, 			\
              			  }

void PI_Run(PIDREG3 *v);

#endif
